package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.PermissionDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Permission;
import com.itheima.pojo.Role;
import com.itheima.service.PermissionServer;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;

/**
 * @desc 权限管理的业务层实现
 * @Date 2020/10/26 14:32
 */
@Service
@Transactional
public class PermissionServerImpl implements PermissionServer {


    @Autowired
    private PermissionDao permissionDao;


    /**
     * 查询所有的权限
     *
     * @param queryPageBean 查询需要的条件 页码 条数 条件
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {

        //获取所有的查询条件
        Integer currentPage = queryPageBean.getCurrentPage();//页码
        Integer pageSize = queryPageBean.getPageSize();  //条数
        String queryString = queryPageBean.getQueryString(); //模糊查询的条件

        //使用mybatis的分页插件
        PageHelper.startPage(currentPage, pageSize);

        //使用模糊查询查询数据库、返回所有查到的数据
        Page<Permission> page = permissionDao.selectByCondition(queryString);

        //获取总条数
        long total = page.getTotal();
        //获取每条数据  这是获取它本身的所有的数据
        List<Permission> rows = page.getResult();

        //返货数据，通过pageResult对象
        return new PageResult(total, rows);
    }

    /**
     * 添加权限
     *
     * @param permission 添加的内容
     */
    @Override
    public void add(Permission permission) throws RuntimeException {

        //还应该去查询数据库，看一下有没有这个权限，权限和权限关键字不可重复
        List<Permission> list = permissionDao.findCountByPermission(permission);

        //如果count>表示已经有角色在使用该权限了
        if (list != null && list.size() > 0) {
            //向controller层抛出一个异常
            throw new RuntimeException("该权限已存在");

        } else {
            //调用接口直接添加
            permissionDao.add(permission);
        }

    }

    /**
     * 通过id查询权限的详细信息
     *
     * @param id 查询权限的id
     * @return 权限的详细信息
     */
    @Override
    public Permission findById(Integer id) {

        //调用接口查询数据库
        Permission permission = permissionDao.findById(id);

        return permission;
    }

    /**
     * 修改权限
     *
     * @param permission 修改后的值
     */
    @Override
    public void update(Permission permission) {


        //还应该去查询数据库，看一下有没有这个权限，权限和权限关键字不可重复
        List<Permission> list = permissionDao.findCountByPermission(permission);


        if (list != null && list.size() > 0) {

            for (Permission p : list) {
                //满足这些条件表示这个修改的条件是他自己  修改的是自己允许重复
                if (p.getKeyword().equals(permission.getKeyword()) || p.getName().equals(permission.getName())) {

                    //将修改后的值，拿到，取数据库再次查询，看一下有没有改成和别人一样的
                    Permission permission1 = new Permission();
                    permission1.setName(p.getName());
                    permission1.setName(p.getKeyword());
                    List<Permission> list1 = permissionDao.findCountByPermission(permission1);

                    //如果满足这个条件，表示他修改后和别人一样了
                    if (list != null && list.size() > 0) {
                        //向controller层抛出一个异常
                        throw new RuntimeException("该权限已存在");

                    }

                    break;
                }else {
                    //想把这个值修改成和其他id相同
                    //向controller层抛出一个异常
                    throw new RuntimeException("该权限已存在");
                }
            }
        }


        permissionDao.update(permission);
    }

    /**
     * 通过id删除权限
     *
     * @param id 要删除权限的id
     */
    @Override
    public void delete(Integer id) {

        //需要通过这个去查询角色表，这个权限在角色表中是否被使用，汝过被使用禁止删除
        Long count = permissionDao.findCountByPerId(id);

        //如果count>表示已经有角色在使用该权限了
        if (count > 0) {
            //向controller层抛出一个异常
            throw new RuntimeException("该权限正在被使用");
        } else {
            //没被使用  ---> 干掉
            permissionDao.delete(id);
        }


    }

    @Override
    public List<Permission> findAll() {

        return  permissionDao.findAll();
    }
}
